package com.waitingresult.reflection;
/**
 * 类加载器
 * 当程序要使用某个类时,如果这个类还没有被加载到内存中,系统就会通过类的加载,连接,初始化这三个步骤来对类进行初始化
 *  不出意外的情况, JVM是连续完成这三个步骤,统称为类加载
 *类的加载
 *  将class文件读入到内存中,并创建一个java.lang.Class 对象
 *  任何类被使用时,JVM都会创建一个 Class对象
 *类的连接
 *  验证阶段
 *      用于验证被加载的类,是否有正确的结构,并和其他类协调一致
 *  准备阶段
 *      负责为类的类变量分配内存,并设置默认的初始化值
 *  解析阶段
 *      将类的二进制数据中的符号引用替换为直接引用
 *类的初始化
 *  在初始化阶段,主要就是给类变量进行初始化
 *  初始化步骤: (JVM永远第一加载的都是java.lang.Object 这个类, 当加载一个类时, 会加载它所有(直接或者间接)的父类)
 *      1. 假如类还没有加载和连接,则程序先加载并连接这个类
 *      2. 假如这个类的直接父类还没有初始化, 就先初始化这个直接父类
 *      3. 假如类中有初始化语句,就先执行这些初始化语句
 *类的初始化时机
 *  1.创建类的实例
 *  2.调用类的静态方法
 *  3.访问类或者接口的静态变量,或者给它赋值
 *  4.使用反射强制创建实例
 *  5.初始化某个类的子类
 *  6.使用java.exe 运行某个类
 *
 * Java虚拟机的类加载机制
 *  1. 全盘负责 : 当一个类加载器负责加载某一个类时,这个类依赖的所有类,都由这一个类加载器去完成,除非显示使用其他的类加载器来载入
 *  2. 父类委托 : 当一个类加载器负责加载某一个类时,会先让父类加载器试图加载这个类,只有在父类加载器无法加载这个类的时候,才会从自己的类路径中去加载
 *  3. 缓存机制 : 保证所有加载过的类都在缓存区, 如果缓存区没有,才会去加载对应的二进制数据,转换为类对象,并且存储到缓冲区
 */
/**
 *  反射的实现方式
 *  1. 类名.class
 *  2. Class.forNAme(全路径名)
 *  3. 对象.getClass()
 */